package com.leyou.user.web;


import com.leyou.common.exception.LyException;
import com.leyou.user.dto.AddressDTO;
import com.leyou.user.dto.UserDTO;
import com.leyou.user.entity.User;
import com.leyou.user.service.UserService;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.stream.Collectors;

@RestController
public class UserController {

    @Autowired
    private UserService userService;


    /**
     * 实现用户数据的校验，主要包括对：
     * 手机号、用户名的唯一性校验。当用户注册时，会输入用户名或手机号，此时页面会异步请求服务端，服务端接收数据，校验数据的唯一性。
     * @param data
     * @param type 1.用户名， 2.手机
     * @return
     */

    @GetMapping("/check/{data}/{type}")
    @ApiOperation(value = "校验用户名数据是否可用，如果不存在则可用")
    @ApiResponses({
            @ApiResponse(code = 200, message = "校验结果有效，true或false代表可用或不可用"),
            @ApiResponse(code = 400, message = "请求参数有误，比如type不是指定值")
    })
    public ResponseEntity<Boolean> checkData(
            @ApiParam(value = "要校验的数据", example = "lisi") @PathVariable("data")String data,
            @ApiParam(value = "数据类型，1：用户名，2：手机号", example = "1") @PathVariable("type") Integer type){


        return ResponseEntity.ok(userService.checkData(data,type));
    }


    /**
     *  用户输入手机号，点击发送验证码，前端会把手机号发送到服务端。
     *  服务端生成随机验证码，长度为6位，纯数字。并且调用短信服务，发送验证码到用户手机
     *
     * @return
     */
    @PostMapping("code")
    public ResponseEntity<Void> sendCode(@RequestParam("phone") String phone){

        userService.sendCode(phone);

        return ResponseEntity.status(HttpStatus.NO_CONTENT).build();

    }


    /**
     * 注册用户
     * 用户页面填写数据，发送表单到服务端，服务端实现用户注册功能。
     * 需要对用户密码进行加密存储，使用MD5加密，
     * 加密过程中使用随机码作为salt加盐。另外还需要对用户输入的短信验证码进行校验
     * @param user 用户信息
     * @param code 验证码
     * @return 无
     */
    @PostMapping("register")
    public ResponseEntity<Void> register(@Valid User user , BindingResult result, @RequestParam("code") String code){

        if (result.hasErrors()){
            String msg = result.getAllErrors().stream()
                    .map(ObjectError::getDefaultMessage).collect(Collectors.joining("|"));
            throw new LyException(400,msg);
        }
        userService.register(user,code);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    /**
     * 查询功能，根据参数中的用户名和密码查询指定用户并且返回用户
     * @param username
     * @param password
     * @return
     */
    @GetMapping("/query")
    public ResponseEntity<UserDTO> queryByUsernameAndPassword(@RequestParam("username") String username,
                                                              @RequestParam("password") String password,
                                                              HttpServletRequest request){

        return ResponseEntity.ok(userService.queryByUsernameAndPassword(username,password));

    }


    /**
     * 根据
     * @param userId 用户id
     * @param id 地址id
     * @return 地址信息
     */
    @GetMapping("/address")
    public ResponseEntity<AddressDTO> queryAddressById(@RequestParam("userId") Long userId, @RequestParam("id") Long id){

        return ResponseEntity.ok(userService.queryAddressById(userId,id));
    }
}
